package com.xinsoft.utils;

import cn.hutool.core.util.RandomUtil;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;

/**
 * @ClassName QuartzUtil
 * @Description 定时任务工具
 * @Author lijie
 * @Date 2023/6/28 9:57 星期三
 * @Version 1.0
 */
public class QuartzUtil {
    /**
     * @return void
     * @Author Li9527
     * @Description 添加定时任务
     * @Date 2023/6/28 10:05
     * @params o-具体任务实现类
     * @params triggerStartTime任务开始时间
     * @params triggerEndTime任务结束时间
     * @params beat间隔心跳-这里暂时只支持小时，但随时可以扩展
     * @params sourceId-执行任务的资源id，比如是巡检计划的，那么要通过计划id去取所有明细执行
     **/
    public static void addJobTask(Class<? extends Job> jobClass, Date triggerStartTime, Date triggerEndTime, Integer beat, Integer sourceId) {
        String rand = RandomUtil.randomNumbers(5);
        String jobKey = "任务" + rand;
        String triggerKey = "触发器" + rand;
//        String cron = "0 0 0/" + beat + " * * ?";
        String cron = "0 0/" + beat + " * * * ?";
        //创建任务调度器
        Scheduler scheduler = null;
        try {
            SchedulerFactory schedulerFactory = new StdSchedulerFactory();
            scheduler = schedulerFactory.getScheduler();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        try {
            if (!scheduler.isShutdown()) {
                scheduler.start();
            }
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
        //创建定时任务job
        JobDetail jobDetail = JobBuilder.newJob(jobClass)
                .usingJobData("sourceId", sourceId)
                .withIdentity(jobKey)
                .build(); //执行
        //创建定时任务触发器
        CronTrigger trigger = TriggerBuilder.newTrigger()
                /**添加认证信息，有3种重写的方法，我这里是其中一种，可以查看源码看其余2种*/
                .withIdentity(triggerKey)
                /**立即生效*/
                .startNow()
                /**开始执行时间*/
                .startAt(triggerStartTime)
                /**结束执行时间,不写永久执行*/
                .endAt(triggerEndTime)
                /**添加执行规则，SimpleTrigger、CronTrigger的区别主要就在这里,我这里是demo，写了个每1分钟执行一次*/
                .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                .build();//执行
        System.out.println("定时任务添加成功：jobKey=" + jobKey +",---------triggerKey=" + triggerKey);
        //添加定时任务
        try {
            scheduler.scheduleJob(jobDetail, trigger);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}
